package com.cencat.order.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 路线信息实体类
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_route")
public class Route implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 路线ID
     */
    @TableId(value = "route_id", type = IdType.AUTO)
    private Long routeId;

    /**
     * 路线编号
     */
    @NotBlank(message = "路线编号不能为空")
    @Size(max = 50, message = "路线编号长度不能超过50个字符")
    @TableField("route_code")
    private String routeCode;

    /**
     * 路线名称
     */
    @NotBlank(message = "路线名称不能为空")
    @Size(max = 100, message = "路线名称长度不能超过100个字符")
    @TableField("route_name")
    private String routeName;

    /**
     * 路线描述
     */
    @Size(max = 500, message = "路线描述长度不能超过500个字符")
    @TableField("route_desc")
    private String routeDesc;

    /**
     * 路线类型(1-固定路线 2-临时路线 3-专线)
     */
    @NotNull(message = "路线类型不能为空")
    @TableField("route_type")
    private Integer routeType;

    /**
     * 起点名称
     */
    @NotBlank(message = "起点名称不能为空")
    @Size(max = 100, message = "起点名称长度不能超过100个字符")
    @TableField("start_point_name")
    private String startPointName;

    /**
     * 起点地址
     */
    @NotBlank(message = "起点地址不能为空")
    @Size(max = 200, message = "起点地址长度不能超过200个字符")
    @TableField("start_point_address")
    private String startPointAddress;

    /**
     * 起点纬度
     */
    @NotNull(message = "起点纬度不能为空")
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("start_latitude")
    private BigDecimal startLatitude;

    /**
     * 起点经度
     */
    @NotNull(message = "起点经度不能为空")
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("start_longitude")
    private BigDecimal startLongitude;

    /**
     * 终点名称
     */
    @NotBlank(message = "终点名称不能为空")
    @Size(max = 100, message = "终点名称长度不能超过100个字符")
    @TableField("end_point_name")
    private String endPointName;

    /**
     * 终点地址
     */
    @NotBlank(message = "终点地址不能为空")
    @Size(max = 200, message = "终点地址长度不能超过200个字符")
    @TableField("end_point_address")
    private String endPointAddress;

    /**
     * 终点纬度
     */
    @NotNull(message = "终点纬度不能为空")
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("end_latitude")
    private BigDecimal endLatitude;

    /**
     * 终点经度
     */
    @NotNull(message = "终点经度不能为空")
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("end_longitude")
    private BigDecimal endLongitude;

    /**
     * 路线距离(公里)
     */
    @DecimalMin(value = "0.0", message = "路线距离不能小于0")
    @TableField("distance")
    private BigDecimal distance;

    /**
     * 预计时长(分钟)
     */
    @Min(value = 0, message = "预计时长不能小于0")
    @TableField("estimated_duration")
    private Integer estimatedDuration;

    /**
     * 路线状态(0-禁用 1-启用 2-维护中)
     */
    @NotNull(message = "路线状态不能为空")
    @TableField("status")
    private Integer status;

    /**
     * 优先级(1-低 2-中 3-高 4-紧急)
     */
    @Min(value = 1, message = "优先级不能小于1")
    @Max(value = 4, message = "优先级不能大于4")
    @TableField("priority")
    private Integer priority;

    /**
     * 最大载重(吨)
     */
    @DecimalMin(value = "0.0", message = "最大载重不能小于0")
    @TableField("max_load")
    private BigDecimal maxLoad;

    /**
     * 最大容量(立方米)
     */
    @DecimalMin(value = "0.0", message = "最大容量不能小于0")
    @TableField("max_volume")
    private BigDecimal maxVolume;

    /**
     * 车辆类型要求
     */
    @Size(max = 100, message = "车辆类型要求长度不能超过100个字符")
    @TableField("vehicle_type_required")
    private String vehicleTypeRequired;

    /**
     * 服务时间窗开始
     */
    @JsonFormat(pattern = "HH:mm:ss")
    @TableField("service_start_time")
    private LocalTime serviceStartTime;

    /**
     * 服务时间窗结束
     */
    @JsonFormat(pattern = "HH:mm:ss")
    @TableField("service_end_time")
    private LocalTime serviceEndTime;

    /**
     * 工作日配送(1-周一到周五 2-周六周日 3-全周)
     */
    @TableField("work_days")
    private Integer workDays;

    /**
     * 配送费用
     */
    @DecimalMin(value = "0.0", message = "配送费用不能小于0")
    @TableField("delivery_fee")
    private BigDecimal deliveryFee;

    /**
     * 燃油费
     */
    @DecimalMin(value = "0.0", message = "燃油费不能小于0")
    @TableField("fuel_fee")
    private BigDecimal fuelFee;

    /**
     * 过路费
     */
    @DecimalMin(value = "0.0", message = "过路费不能小于0")
    @TableField("toll_fee")
    private BigDecimal tollFee;

    /**
     * 其他费用
     */
    @DecimalMin(value = "0.0", message = "其他费用不能小于0")
    @TableField("other_fee")
    private BigDecimal otherFee;

    /**
     * 总费用
     */
    @DecimalMin(value = "0.0", message = "总费用不能小于0")
    @TableField("total_fee")
    private BigDecimal totalFee;

    /**
     * 商家ID
     */
    @TableField("merchant_id")
    private Long merchantId;

    /**
     * 商家名称
     */
    @Size(max = 100, message = "商家名称长度不能超过100个字符")
    @TableField("merchant_name")
    private String merchantName;

    /**
     * 负责司机ID
     */
    @TableField("driver_id")
    private Long driverId;

    /**
     * 负责司机姓名
     */
    @Size(max = 50, message = "负责司机姓名长度不能超过50个字符")
    @TableField("driver_name")
    private String driverName;

    /**
     * 路线标签
     */
    @Size(max = 200, message = "路线标签长度不能超过200个字符")
    @TableField("route_tags")
    private String routeTags;

    /**
     * 路线图片
     */
    @Size(max = 500, message = "路线图片长度不能超过500个字符")
    @TableField("route_images")
    private String routeImages;

    /**
     * 路径坐标点(JSON格式)
     */
    @TableField("route_points")
    private String routePoints;

    /**
     * 中转点信息(JSON格式)
     */
    @TableField("waypoints")
    private String waypoints;

    /**
     * 路况信息
     */
    @Size(max = 500, message = "路况信息长度不能超过500个字符")
    @TableField("traffic_info")
    private String trafficInfo;

    /**
     * 天气要求
     */
    @Size(max = 100, message = "天气要求长度不能超过100个字符")
    @TableField("weather_requirement")
    private String weatherRequirement;

    /**
     * 特殊要求
     */
    @Size(max = 500, message = "特殊要求长度不能超过500个字符")
    @TableField("special_requirements")
    private String specialRequirements;

    /**
     * 安全等级(1-低 2-中 3-高)
     */
    @Min(value = 1, message = "安全等级不能小于1")
    @Max(value = 3, message = "安全等级不能大于3")
    @TableField("safety_level")
    private Integer safetyLevel;

    /**
     * 难度等级(1-简单 2-中等 3-困难)
     */
    @Min(value = 1, message = "难度等级不能小于1")
    @Max(value = 3, message = "难度等级不能大于3")
    @TableField("difficulty_level")
    private Integer difficultyLevel;

    /**
     * 使用次数
     */
    @Min(value = 0, message = "使用次数不能小于0")
    @TableField("usage_count")
    private Integer usageCount;

    /**
     * 成功率(%)
     */
    @DecimalMin(value = "0.0", message = "成功率不能小于0")
    @DecimalMax(value = "100.0", message = "成功率不能大于100")
    @TableField("success_rate")
    private BigDecimal successRate;

    /**
     * 平均评分
     */
    @DecimalMin(value = "0.0", message = "平均评分不能小于0")
    @DecimalMax(value = "5.0", message = "平均评分不能大于5")
    @TableField("avg_rating")
    private BigDecimal avgRating;

    /**
     * 评价数量
     */
    @Min(value = 0, message = "评价数量不能小于0")
    @TableField("rating_count")
    private Integer ratingCount;

    /**
     * 最后使用时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_used_time")
    private LocalDateTime lastUsedTime;

    /**
     * 是否推荐(0-否 1-是)
     */
    @TableField("is_recommended")
    private Integer isRecommended;

    /**
     * 是否热门(0-否 1-是)
     */
    @TableField("is_popular")
    private Integer isPopular;

    /**
     * 删除标志(0-存在 1-删除)
     */
    @TableLogic
    @TableField("del_flag")
    private Integer delFlag;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;

    /**
     * 创建者
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新者
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    @TableField("ext_field1")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    @TableField("ext_field2")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    @TableField("ext_field3")
    private String extField3;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;
}